home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / applications / wp / dvi2lj.lha / copypsfile.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-02-14  |  8.0 KB  |  300 lines

  1. /*----------------------------------------------------------------------*
  2.  
  3.     copypsfile - convert PostScript file to HP graphics  
  4.                 
  5.                 Peter A. Henning (P.Henning@gsi.de)
  6.                 February, 1995
  7.  
  8.  *----------------------------------------------------------------------*/
  9.  
  10. #include "config.h" 
  11. #include "commands.h"
  12.  
  13. #include <dos.h>
  14. #include <math.h>
  15. #include <string.h>
  16. #include <signal.h>
  17. #include <stdio.h>
  18. #include <ctype.h>
  19.  
  20. #ifdef vms
  21. #include <file.h>
  22. #else
  23. #include <fcntl.h>
  24. #endif
  25.  
  26. #ifdef MSDOS
  27. #include <dos.h>     /* only for binaryopen on device  */
  28. #endif
  29.  
  30. #ifdef  unix
  31. #include <limits.h>
  32. #endif
  33.  
  34. #ifdef _AMIGA
  35. # include <exec/exec.h>
  36. # include <exec/execbase.h>
  37. # include <exec/tasks.h>
  38. # include <proto/dos.h>
  39. # include <proto/exec.h>
  40. # include <fcntl.h>
  41. # include <ios1.h>
  42. # include "postlib.h"
  43.  
  44. /*-- Assembler routines */
  45.  
  46.  
  47. extern void insertbreak(void);
  48. extern void deletebreak(void);
  49. extern void insertftrap(void);
  50. extern void deleteftrap(void);
  51.  
  52. /*-- Routines defined and referenced only within this module */
  53.  
  54. extern void __saveds __asm copypage(register __d0 int num);
  55.  
  56. #endif
  57.  
  58. extern FILE    *outfp;
  59.  
  60. extern short   x_goffset;         /* global x-offset in dots             */
  61. extern short   y_goffset;         /* global y-offset in dots             */
  62. extern long    hconv, vconv;      /* converts DVI units to pixels        */
  63. extern long    h;                 /* current horizontal position         */
  64. extern long    v;                 /* current vertical position           */
  65.  
  66. #define PIXROUND(x,c) (((x)+c)/c)
  67.  
  68. /*-->CopyPSFile*/   /* interpret a Postscript file */
  69. /*********************************************************************/
  70. /***************************** CopyPSFile ****************************/
  71. /*********************************************************************/
  72.  
  73. struct Library *PSbase;
  74. struct PSparm parm;
  75.  
  76. int arec,hoff,voff,retcode;
  77. int breakset, ftrapset;
  78.  
  79. void
  80. CopyPSFile( char *str, char *hscale,  char *vscale,
  81.                        char *hoffset, char *voffset,
  82.                        char *hsize,   char *vsize,
  83.                        char *angle)
  84. {   FILE *PStemp;
  85.     char *files[]={"tex:ps/init.ps","tex:ps/specs.pro",
  86.                    "T:post.tmp"," "};
  87.     char *dum;
  88.  
  89.     char *pages[7]={"hscale","vscale","hoffset","voffset",
  90.                   "hsize","vsize","angle"};
  91.     int pagel[7][3]={{0,300,100},{0,300,100},
  92.                    {-612,612,0},{-792,792,0},
  93.                    {-612,612,0},{-792,792,0},{0,360,0}};
  94.     int i,dx,rx,ry,pagep[7];
  95.  
  96.     files[3] = str;
  97.     pagep[0] = (int)strtol(hscale,&dum,10);
  98.     pagep[1] = (int)strtol(vscale,&dum,10);
  99.     pagep[2] = (int)strtol(hoffset,&dum,10);
  100.     pagep[3] = (int)strtol(voffset,&dum,10);
  101.     pagep[4] = (int)strtol(hsize,&dum,10);
  102.     pagep[5] = (int)strtol(vsize,&dum,10);
  103.     pagep[6] = (int)strtol(angle,&dum,10);
  104.     
  105.     /*-- check the values for consistency */
  106.     for(i=0;i<7;i++)
  107.     {  if( (pagep[i] > pagel[i][1])||(pagep[i] < pagel[i][0]) )
  108.        {  Warning("\\special parameter %s out of range, set to %d",
  109.             pages[i],pagel[i][2]);
  110.           pagep[i] = pagel[i][2];
  111.        }
  112.     };
  113.     fprintf(stderr,
  114.        " (%s %d %d %d %d %d %d %d",str,pagep[0],pagep[1],pagep[2],
  115.        pagep[3],pagep[4],pagep[5],pagep[6]);
  116.  
  117.    /*-- Open the library */
  118.     PSbase = OpenLibrary("post.library", POSTVERNO);
  119.     if (PSbase == NULL)
  120.     {   Warning("Unable to open post.library");
  121.         goto errorexit;
  122.     }
  123.  
  124.    /*-- Open the tempfile */
  125.     PStemp = fopen(files[2], "w");
  126.     if (PStemp == NULL)
  127.     {   Warning("Unable to open %s",files[2]);
  128.         goto errorexit;
  129.     }
  130.  
  131.   /*-- Determine the page size and offsets 
  132.        max. size 2480 (3507) dots, printer margin 50 dots,
  133.        subtract current position, corrected for angle */
  134.     rx = (int)PIXROUND(h, hconv) + x_goffset;
  135.     ry = (int)PIXROUND(v, vconv) + y_goffset;
  136.     dx = min( (int)(ry*sin(pagep[6]/180.0*PI)),(rx-50) );
  137.  
  138.     hoff = -dx;
  139.     voff = -(ry-50);
  140.     
  141.     parm.page.depth   = 1;
  142.     parm.page.xoff    = -dx;
  143.     parm.page.yoff    = 0;
  144.     parm.page.xsize   = 2480-50-rx+dx;
  145.     parm.page.ysize   = ry-50;
  146.     parm.page.xbytes  = (parm.page.xsize + 7) >> 3;
  147.     parm.page.len     = parm.page.xbytes * parm.page.ysize;
  148.     parm.page.ybase   = 0;                  /*-- only for bands */
  149.     parm.page.yheight = parm.page.ysize;
  150.     parm.page.xden    = 300;
  151.     parm.page.yden    = 300;
  152.     parm.page.ydir    = -1;
  153.  
  154.     /*-- Write the tempfile */
  155.     fprintf(PStemp,"@beginspecial\n");
  156.     fprintf(PStemp,"%d @hscale  %d @vscale\n",pagep[0],pagep[1]);
  157.     fprintf(PStemp,"%d @hoffset %d @voffset\n",pagep[2],pagep[3]);
  158.     if( pagep[4]!=pagel[4][2] )
  159.        fprintf(PStemp,"%d @hsize ",pagep[4]);
  160.     if( pagep[5]!=pagel[5][2] )
  161.        fprintf(PStemp,"%d @vsize ",pagep[5]);
  162.     if( pagep[6]!=0 ) 
  163.        fprintf(PStemp,"%d @angle ",pagep[6]);
  164.     fprintf(PStemp,"@setspecial\n");
  165.     fclose(PStemp);
  166.  
  167.      
  168.     /*-- Allocate the page buffer */
  169.     if ((parm.page.buf[0] =
  170.         AllocMem(parm.page.len, MEMF_PUBLIC|MEMF_CLEAR)) == NULL)
  171.         {   Warning(
  172.               "Can't get PostScript page buffer %d bytes",parm.page.len);
  173.             goto errorexit;
  174.         };
  175.     fprintf(stderr,", buffer %d bytes",parm.page.len);
  176.     
  177.  
  178.     /*-- Initialize for interpretation */
  179.     insertbreak();
  180.     SetExcept(~0, SIGBREAKF_CTRL_C);
  181.     breakset = 1;
  182.     insertftrap();
  183.     ftrapset = 1;
  184.  
  185.     parm.copyfunc = (APTR) copypage;
  186.  
  187.     parm.infh  = Input();
  188.     parm.outfh = Output();
  189.     parm.errfh = (BPTR) Open("*", MODE_OLDFILE);
  190.     if (parm.errfh == NULL)
  191.     {   retcode = 20;
  192.         goto tidyexit;
  193.     }
  194.  
  195.     arec = PScreateact(&parm);
  196.     if (arec == 0)
  197.     {   Warning("Can't get memory for PostScript");
  198.         goto errorexit;
  199.     }
  200.  
  201.     if ((unsigned) arec <= errmax)
  202.     {   arec = 0;
  203.         retcode = 10;
  204.         goto tidyexit;
  205.     }
  206.  
  207.     /*-- interpret the argument files */
  208.     for (i = 0; i < 4; i++)
  209.     {   fprintf(stderr,"<%s>",files[i]);
  210.         if (PSintstring(arec, files[i],
  211.            -1, PSFLAGFILE|PSFLAGCLEAR|PSFLAGERASE) != 0)
  212.         {   retcode = 10;
  213.             goto tidyexit;
  214.         }
  215.     } 
  216.  
  217. errorexit:
  218.     retcode = 20;
  219.    /*-- Tidy up and exit */
  220. tidyexit:
  221.     if (breakset)
  222.     {   SetExcept(0, SIGBREAKF_CTRL_C);
  223.         deletebreak();
  224.         breakset = 0;
  225.     }
  226.     if (ftrapset)
  227.     {   deleteftrap();
  228.         ftrapset = 0;
  229.     }
  230.  
  231.     if (arec) PSdeleteact(arec);
  232.  
  233.     if (parm.page.buf[0])
  234.     {   FreeMem(parm.page.buf[0], parm.page.len);
  235.         parm.page.buf[0] = NULL;
  236.     };
  237.  
  238.     if (PSbase) CloseLibrary(PSbase);
  239.  
  240.     if (parm.errfh) Close(parm.errfh);
  241.  
  242.     fprintf(stderr,") ");
  243. }
  244.  
  245. /*-- Signal an interrupt ----------------------------------------*/
  246.  
  247. void __saveds sigint()
  248. {   PSsignalint(arec, 1);
  249. }
  250.  
  251. /*-- Signal a floating point error ------------------------------*/
  252.  
  253. void __saveds sigfpe()
  254. {   PSsignalfpe(arec);
  255. }
  256.  
  257. /*-- Copy the page to the output --------------------------------*/
  258.  
  259. void __saveds __asm copypage(register __d0 int num)
  260. {   char *buf;
  261.     int ysize,len;
  262.  
  263.     fprintf(stderr,", copypage");
  264.  
  265.     /*-- move cursor with offsets, 
  266.          resolution 300 dpi, start graphics  */
  267.     fprintf(outfp, "\33*p%+dx%+dY\33*t300R\33*r1A",hoff,voff);
  268.  
  269.     /*-- loop for the rows */
  270.     buf   = parm.page.buf[0];
  271.     ysize = parm.page.ysize;
  272.  
  273.     while (ysize--)
  274.     {   len = parm.page.xbytes;
  275.         /*-- strip trailing zeros */         
  276.         while (len && buf[len - 1] == 0) len--;
  277.         /*-- dump line of pixels */
  278.         fprintf(outfp, "\33*b%dW", len);
  279.         fwrite(buf, 1, len, outfp);
  280.         buf += parm.page.xbytes;
  281.     }
  282.  
  283.     /*-- end graphics, form feed, reset number of copies */
  284.     fprintf(outfp, "\33*rB");
  285.  
  286.     /*-- test for error */
  287.     if (ferror(outfp)) PSerror(arec, errioerror);
  288. }
  289.  
  290. /*-->CopyIFFFile*/   /* interpret an IFF file */
  291. /*********************************************************************/
  292. /***************************** CopyIFFFile ***************************/
  293. /*********************************************************************/
  294.  
  295. void
  296. CopyIFFFile( char *str,char *hoffset, char *voffset,
  297.                        char *hsize,   char *vsize)
  298. {  Warning("CopyIFFFile not yet implemented");
  299. }
  300.